#include "Common.hpp"

// 创建初始化类对象
// 在程序开始和结束时创建和销毁管道文件
Init init;

int main()
{
    // 1.获取用于区分共享内存的唯一关键字
    key_t key = ftok(g_path_name, g_proj_id);
    if(key < 0)
    {
        perror("Server# ftok");
        exit(1);
    }
    printf("Server# ftok success!\n");

    // 2.创建共享内存
    // 创建全新的共享内存，如果共享内存已经存在，就直接报错，起始权限设为0666
    int shmid = shmget(key, g_shm_size, IPC_CREAT | IPC_EXCL | 0666);
    if(shmid < 0)
    {
        perror("Server# shmget error");
        exit(2);
    }
    printf("Server# shmget success!\n");

    // 3.共享内存与进程地址空间相关联
    char* shmaddr = (char*)shmat(shmid, nullptr, 0);
    if(shmaddr == nullptr)
    {
        perror("Server# shmat error");
        exit(3);
    }
    printf("Server# shmat success!\n");

    // ... 通信逻辑
    // 通过管道来为共享内存添加访问控制

    int fd = OpenFIFO(g_fifo_fikename, O_RDONLY);

    while(true)
    {
        Wait(fd);
        printf("Client Message# %s\n", shmaddr);
        if(strcmp(shmaddr, "quit") == 0)
        {
            break;
        }
        // sleep(1);
    }

    CloseFIFO(fd);

    // ... 通信逻辑
    // 每次间隔1s从共享内存中读取数据
    // while(true)
    // {
    //     printf("Client Message# %s\n", shmaddr);
    //     if(strcmp(shmaddr, "quit") == 0)
    //     {
    //         break;
    //     }
    //     sleep(1);
    // }

    // 4.接触共享内存与进程地址空间的绑定
    if(shmdt(shmaddr) < 0)
    {
        perror("Server# shmdt error");
        exit(4);
    }
    printf("Server# shmdt success!\n");

    // 5.删除共享内存
    if(shmctl(shmid, IPC_RMID, nullptr) < 0)
    {
        perror("Server# shmctl");
    }
    printf("Server# delete shm success!\n");

    return 0;
}